package dialer.client.web.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import dialer.ws.base.entity.Agent;
import dialer.ws.base.exception.EntityException;
import dialer.ws.base.exception.EntityExistException;
import dialer.ws.business.service.AgentsService;
import dialer.ws.common.util.FacesUtils;

@ManagedBean(name = "agents")
@SessionScoped
public class AgentsController implements Serializable {

	private static final long serialVersionUID = 4820537140705088871L;

	private static final Log log = LogFactory.getLog(AgentsController.class);

	private List<Agent> listAgent = new ArrayList<Agent>();

	@ManagedProperty("#{agentsService}")
	private AgentsService agentsService;

	private String estado = "*";

	private Agent selectedAgent = new Agent();

	private String nombre;
	private String numero;
	private String password;
	private String estatus;

	public AgentsController() {
		clear();
	}

	@PostConstruct
	public void init() {
		listAgent = agentsService.findAll();
	}

	public void clear() {
		log.info("### clear");
		listAgent = new ArrayList<Agent>();
	}

	public void actualizarLista() {
		log.info("### actualizarLista " + estado);
		if (estado != null && !estado.equals("")) {
			if (estado.equals("*")) {
				listAgent = agentsService.findAll();
			} else {
				listAgent = agentsService.getAgentByState(estado);
			}
		}
	}

	public void desconectar() {
		log.info("### Desconectar");
		if (selectedAgent.getEstado().equals("A") == true) {
			selectedAgent.setEstado("I");
			selectedAgent.setRpassword("");
			try {
				agentsService.merge(selectedAgent);
				actualizarLista();
				FacesUtils.addInfoMessage("Satisfactorio", "Se DesActivo correctamente");
			} catch (EntityException e) {
				log.error("### ERROR: " + e);
				FacesUtils.addErrorMessage("Error", "error");
			}
		}
	}

	public void actualizar() {
		log.info("### Actualizar");
		try {
			Agent a = new Agent();
			a.setId(selectedAgent.getId());
			a.setNombre(selectedAgent.getNombre());
			a.setNumero(selectedAgent.getNumero());
			a.setPassword(selectedAgent.getPassword());
			a.setEstado(selectedAgent.getEstado());
			agentsService.merge(a);
			actualizarLista();
			FacesUtils.addInfoMessage("Satisfactorio", "Se Actualizo correctamente");
		} catch (EntityException e) {
			log.error("### ERROR: " + e);
			FacesUtils.addErrorMessage("Error", "error");
		}
	}

	public void limpiarAgente() {
		log.info("### LimpiarAgente ");
		nombre = "";
		numero = "";
		password = "";
	}

	public void crear() {
		log.info("### Crear");
		Agent a = new Agent();
		a.setNombre(nombre);
		a.setNumero(numero);
		a.setPassword(password);
		a.setEstado("I");
		a.setRpassword("");
		try {
			agentsService.persist(a);
			clear();
			actualizarLista();
			FacesUtils.addInfoMessage("Satisfactorio", "se guardo correctamente");
		} catch (EntityExistException e) {
			log.error("### ERROR: " + e);
			FacesUtils.addErrorMessage("Error", "error");
		} catch (EntityException e) {
			log.error("### ERROR: " + e);
			FacesUtils.addErrorMessage("Error", "error");
		}
	}

	public List<Agent> getListAgent() {
		return listAgent;
	}

	public void setListAgent(List<Agent> listAgent) {
		this.listAgent = listAgent;
	}

	public AgentsService getAgentsService() {
		return agentsService;
	}

	public void setAgentsService(AgentsService agentsService) {
		this.agentsService = agentsService;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Agent getSelectedAgent() {
		return selectedAgent;
	}

	public void setSelectedAgent(Agent selectedAgent) {
		this.selectedAgent = selectedAgent;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEstatus() {
		return estatus;
	}

	public void setEstatus(String estatus) {
		this.estatus = estatus;
	}

}
